﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Dynamic;
namespace ZF.BLL.Linq
{
    public static class DynamicQueryable
    {
        public static IQueryable<T> Where<T>(this IQueryable<T> source,IFilterExpressionContainer container)
        {
            var expressions = container.GetExpressions();
            foreach (var exp in expressions)
            {
                source = source.Where(exp.Predicate, exp.Values);
            }
            return source;
        }
        
        //
        // 摘要:
        //     返回指定序列中的元素；如果序列为空，则返回单一实例集合中的指定值。
        //
        // 参数:
        //   source:
        //     序列为空时为其返回指定值的序列。
        //
        //   defaultValue:
        //     序列为空时要返回的值。
        //
        // 类型参数:
        //   TSource:
        //     source 中的元素的类型。
        //
        // 返回结果:
        //     如果 source 为空，则为包含 defaultValue 的 System.Collections.Generic.IEnumerable<T>；否则为
        //     source。
        public static TSource DefaultIfEmpty<TSource>(this IEnumerable<TSource> source,Func<TSource, bool> predicate, TSource defaultValue)
        {
            var result = source.FirstOrDefault(predicate);
            if (result == null)
                result = defaultValue;
            return result;
        }
    }
}
